home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 22
/
Cream of the Crop 22.iso
/
program
/
snpd9611.zip
/
FILECAT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-11-24
|
5KB
|
235 lines
/* +++Date last modified: 17-Nov-1996 */
/*
** FILECAT.C - Adds one file onto another vertically, as with a column
** block in QEdit.
**
** Must be compiled in Compact or Large memory models to use larger
** files.
**
** Public Domain by Chad Wallace, 1996
*/
#include <stdio.h>
#include <alloc.h>
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
/*
** filecat() error codes
*/
enum {
FC_SUCCESS = 0, /* Success */
FC_RDEST, /* Error reading dest file */
FC_WDEST, /* Error writing dest file */
FC_SRC, /* Error with src file */
FC_MEM, /* Out of memory */
FC_LINES, /* Too many lines (increase max_lines) */
FC_LINE /* Line too long (increase line_max) */
};
/*
** These are global to save overhead when calling cleanup function
*/
static char ** str_arr;
static char * temp_str;
/*
** Frees all allocated memory and closes specified file
*/
static void cleanup(int tot_lines, FILE * fp)
{
if (str_arr)
{
for ( ; tot_lines >= 0; tot_lines--)
free(str_arr[tot_lines]);
free(str_arr);
}
if (temp_str)
free(temp_str);
if (fp)
fclose(fp);
}
int filecat(char * dest_file, char * src_file, int line_max, int max_lines)
{
int i, tot_lines;
unsigned int lines_len;
FILE * fp;
if ((temp_str = malloc(line_max + 1)) == NULL)
return FC_MEM;
/* Allocate memory for pointers to line strings */
if ((str_arr = calloc(max_lines + 1, sizeof(char *))) == NULL)
{
free(temp_str);
return FC_MEM;
}
/* Open destination file */
if ((fp = fopen(dest_file, "rt")) == NULL)
{
free(temp_str);
free(str_arr);
return FC_RDEST;
}
/* Read destination file into string array line-by-line */
for (i = 0;
(fgets(temp_str, line_max + 1, fp) != NULL) && (i <= max_lines);
i++)
{
/* Strip trailing newline from line read */
if (temp_str[strlen(temp_str) - 1] == '\n')
temp_str[strlen(temp_str) - 1] = '\0';
/* Allocate memory */
if ((str_arr[i] = malloc(line_max + 1)) == NULL)
{
/* Clean up and return memory error */
cleanup(i, fp);
return FC_MEM;
}
/* Copy the string to its new home */
strcpy(str_arr[i], temp_str);
}
fclose(fp);
if (i > max_lines)
{
/* Clean up and return too many lines error */
cleanup(i, NULL);
return FC_LINES;
}
/* Get length of longest line */
lines_len = max_line(str_arr);
/* Open source file */
if ((fp = fopen(src_file, "rt")) == NULL)
{
/* Clean up and return source file error */
cleanup(i, NULL);
return FC_SRC;
}
tot_lines = i;
/*
** Get each line from src file and append to corresponding line from
** dest file
*/
for (i = 0;
(fgets(temp_str, line_max + 1, fp) != NULL) && (i < max_lines);
i++)
{
int j;
/* Has this line been allocated yet? */
if (str_arr[i] == NULL)
{
/* Allocate memory */
if ((str_arr[i] = malloc(line_max + 1)) == NULL)
{
/* Clean up and return memory error */
cleanup(tot_lines, fp);
return FC_MEM;
}
/* Initialize string */
str_arr[i][0] = '\0';
tot_lines++;
}
/* Pad with spaces to make this line as long as longest */
for (j = strlen(str_arr[i]); j < lines_len; j++)
str_arr[i][j] = ' ';
str_arr[i][j] = '\0';
/* Check size of resulting line when strcat'd */
if (lines_len + strlen(temp_str) > line_max)
{
cleanup(tot_lines, fp);
return FC_LINE;
}
strcat(str_arr[i], temp_str);
}
fclose(fp);
if (i > max_lines)
{
/* Clean up and return too many lines error */
cleanup(i, NULL);
return FC_LINES;
}
/* Open dest file again, to write this time */
if ((fp = fopen(dest_file, "wt")) == NULL)
{
/* Clean up and return source file error */
cleanup(i, NULL);
return FC_WDEST;
}
for (i = 0; i < tot_lines; i++)
{
if ((fputs(str_arr[i], fp) == EOF) /*|| (fputc('\n', fp) == EOF)*/)
{
cleanup(i, fp);
return FC_WDEST;
}
}
cleanup(i, fp);
return FC_SUCCESS;
}
int main(int argc, char ** argv)
{
printf("Filecat returned %d\n", filecat(argv[1], argv[2], 2048, 4096));
return 0;
}